package applicationModels;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.databinding.observable.ObservableEvent;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import org.uqbar.arena.bindings.ObservableCaption;
import org.uqbar.arena.bindings.ObservableProperty;
import org.uqbar.commons.utils.FireChange;
import org.uqbar.commons.utils.Observable;

import com.uqbar.poo.aop.ObservableBehavior;

import database.Tienda;
import modelo.Asignacion;
import modelo.Dia;
import modelo.Empleado;
import modelo.Excepcion;
import modelo.Horario;
import modelo.Planificacion;

@Observable
public class AsignadorDeEmpleados {

	private LocalDate fecha;
	private List<Empleado> empleados;
	private Empleado empleadoSeleccionado;
	private List<IntObservable> horariosPosiblesSelector1 = this.listaInts(0,
			19);
	private List<IntObservable> horariosPosiblesSelector2 = new ArrayList<IntObservable>();
	private IntObservable inicio = new IntObservable(0);
	private IntObservable fin;
	private Planificacion planificacion;

	public AsignadorDeEmpleados(Planificacion planificacion) {
		this.planificacion = planificacion;
		this.fecha = planificacion.getFecha();
	}

	public void buscar() {
		this.empleados = Tienda.getInstance().buscar(this.getFecha(),
				new LocalTime(getInicio().getValor(), 0),
				new LocalTime(this.getFin().getValor(), 0));
	}

	public void guardarAsignacion() {

		LocalTime inicio = new LocalTime(this.getInicio().getValor(), 0);
		LocalTime fin = new LocalTime(this.getFin().getValor(), 0);

		Asignacion asig = new Asignacion(this.getFecha(), new Horario(inicio,
				fin));

		asig.setEmpleadoAsignado(this.getEmpleadoSeleccionado());
		this.getEmpleadoSeleccionado().agregarAsignacion(asig);
		this.getPlanificacion().agregarAsignacion(asig);

	}

	public void calcularInts() {

		int princ = this.getInicio().getValor();

		setHorariosPosiblesSelector2(this.listaInts(princ + 4, princ + 8));

	}

	public List<Empleado> getEmpleados() {
		return empleados;
	}

	public void setEmpleados(List<Empleado> empleados) {
		this.empleados = empleados;
	}

	public List<IntObservable> listaInts(int desde, int hasta) {

		List<IntObservable> ret = new ArrayList<IntObservable>();

		for (int i = desde; i < (hasta + 1); i++) {
			if (i > 23) {
				return ret;
			}
			ret.add(new IntObservable(i));
		}

		return ret;

	}

	public List<IntObservable> getHorariosPosiblesSelector1() {
		return horariosPosiblesSelector1;
	}

	public void setHorariosPosiblesSelector1(
			List<IntObservable> horariosPosiblesSelector1) {
		this.horariosPosiblesSelector1 = horariosPosiblesSelector1;
	}

	public List<IntObservable> getHorariosPosiblesSelector2() {
		return horariosPosiblesSelector2;
	}

	public void setHorariosPosiblesSelector2(
			List<IntObservable> horariosPosiblesSelector2) {
		this.horariosPosiblesSelector2 = horariosPosiblesSelector2;
	}

	public IntObservable getInicio() {
		return inicio;
	}

	public void setInicio(IntObservable inicio) {
		this.inicio = inicio;
		calcularInts();
	}

	public IntObservable getFin() {
		return fin;
	}

	public void setFin(IntObservable fin) {
		this.fin = fin;
	}

	public LocalDate getFecha() {
		return fecha;
	}

	public void setFecha(LocalDate fecha) {
		this.fecha = fecha;
	}

	public Planificacion getPlanificacion() {
		return planificacion;
	}

	public void setPlanificacion(Planificacion planificacion) {
		this.planificacion = planificacion;
	}

	public Empleado getEmpleadoSeleccionado() {
		return empleadoSeleccionado;
	}

	public void setEmpleadoSeleccionado(Empleado empleadoSeleccionado) {
		this.empleadoSeleccionado = empleadoSeleccionado;
	}

	public String getDisponibilidad(Empleado e) {
		LocalTime inicio = new LocalTime(this.getInicio().getValor(), 0);
		LocalTime fin = new LocalTime(this.getFin().getValor(), 0);

		Asignacion asignacion = new Asignacion(this.getFecha(), new Horario(
				inicio, fin));
		
		boolean fueAsignado = this.planificacion.estaAsignado(e);
		
		if(fueAsignado){
			return "No- Fue asignado de " + this.getInicio().getValor() + "a " + this.getFin().getValor();
		}else{
			return this.tieneExcepcion(e, asignacion);
		}
	}

	private String puedeTrabajar(Empleado e, Asignacion asignacion) {
		if (e.puedeTrabajar(asignacion)) {
			return "Sí";
		} else {
			return this.tieneExcepcion(e, asignacion);
		}
	}

	private String tieneExcepcion(Empleado e, Asignacion asignacion) {
		if (e.tieneExcepcion(asignacion.getFecha())) {

			Excepcion excepcion = e.getExcepcion(asignacion.getFecha());

			if (excepcion.puedeTrabajar()) {
				return "Si- " + excepcion.toString();
			} else {
				return "NO- " + excepcion.toString();
			}
		} else {
			return this.estaDisponible(e, asignacion);
		}
	}

	private String estaDisponible(Empleado e, Asignacion asignacion) {
		if(e.estaDisponible(Dia.getDia(asignacion.getFecha()), asignacion.getHorario())){
			return "SI - tiene disponibilidad este dia a esta hora";
		}else{
			return "No tiene disponibilidad para este dia";
		}
	}

}
